클로드 코드 완벽 가이드 — 17장 인증 구현하기 딥다이브 학습 노트

출처: 클로드 코드 완벽 가이드 (코드팩토리 최지호) | 참고: https://github.com/codefactory-co


17장에서 다루는 내용

  • Supabase 설정하기 — BaaS 플랫폼 가입, 프로젝트 생성, 인증 Provider 설정
  • Context7 MCP 연동하기 — 최신 라이브러리 문서를 클로드 코드에 제공하는 방법
  • Supabase 인증 연동하기 — 클로드 코드를 활용해 이메일 로그인/회원가입 SSR 인증 시스템 구현

전체 흐름도

[Supabase 설정]          [Context7 MCP 연동]        [Supabase 인증 연동]
    |                        |                          |
    v                        v                          v
+-------------------+  +---------------------+  +---------------------------+
| 1. 가입 & Org     |  | 1. MCP 설치          |  | 1. 클로드에 계획 요청      |
|    생성            |  |    claude mcp add    |  |    (경계 명확히 설정)      |
| 2. 프로젝트 생성   |  |    context7          |  | 2. SSR 구현 계획 수립      |
|    (이름/비밀번호/ |  | 2. /mcp 명령으로     |  |    @supabase/ssr 패키지   |
|     리전 선택)     |  |    연결 확인         |  | 3. 작업 실행 지시          |
| 3. Email Provider |  +---------------------+  |    .env.local 설정         |
|    활성화          |       |                    |    클라이언트 유틸리티     |
|    Confirm Email  |       v                    |    미들웨어 설정           |
|    해제            |  최신 Supabase 문서를     |    인증 페이지             |
| 4. Connect 버튼   |  클로드가 직접 참조        |    Server Actions          |
|    URL/AnonKey    |                            |    콜백 처리               |
|    복사 저장       |                            | 4. .env.local 값 입력      |
+-------------------+                            | 5. 서버 재시작 & 확인     |
        |                                        +---------------------------+
        v                                                    |
  .env.local 파일에 저장                                     v
  NEXT_PUBLIC_SUPABASE_URL=<URL>               로그인/회원가입 동작 완성
  NEXT_PUBLIC_SUPABASE_ANON_KEY=<KEY>

선수 지식 체크리스트

  • [ ] 16장: UI 프로토타이핑 (로그인/회원가입 페이지 시안 제작)
  • [ ] Next.js App Router 기본 개념 (Server Components, Server Actions)
  • [ ] 환경변수(.env.local) 사용법
  • [ ] 쿠키 기반 세션 관리 개념

핵심 키워드

키워드 의미
Supabase 오픈소스 기반의 BaaS(Backend as a Service) 플랫폼. PostgreSQL 데이터베이스를 기반으로 인증, 스토리지, API 등 백엔드 기능을 통합 제공한다
BaaS Backend as a Service. 서버 개발 없이 인증, 데이터베이스, 파일 저장 등 백엔드 기능을 클라우드 서비스로 제공받는 방식
Anon Key Supabase에 연결할 때 사용하는 공개 키. 클라이언트 측에서 Supabase API에 접근할 수 있도록 허용하는 익명 키이다
Context7 MCP 다양한 패키지의 공식 문서를 자동 수집하여, LLM이 최신 문서를 참조할 수 있게 해주는 MCP 서버
@supabase/ssr Supabase의 SSR(Server-Side Rendering) 전용 패키지. 쿠키 기반 세션 관리를 지원하여 Next.js 서버 컴포넌트에서 인증을 처리할 수 있다
Server Actions Next.js의 서버 측 함수. 폼 제출이나 데이터 변경을 서버에서 직접 처리하여 API 라우트 없이 백엔드 로직을 실행한다
Middleware Next.js에서 요청이 페이지에 도달하기 전에 실행되는 코드. 인증 상태 확인, 세션 갱신, 비인증 사용자 리다이렉트 등에 사용한다
Confirm Email Supabase의 이메일 확인 기능. 활성화하면 가입 시 이메일 인증을 거쳐야 한다. 개발 단계에서는 해제하여 테스트를 편리하게 한다
SSR (Server-Side Rendering) 서버에서 HTML을 완성하여 클라이언트에 보내는 방식. SEO에 유리하고, 쿠키 기반 인증과 함께 안전한 세션 관리가 가능하다

섹션 1: Supabase 설정하기

한 줄 요약

Supabase에 가입하고 프로젝트를 생성한 뒤, Email Provider를 활성화하고 연결에 필요한 URL과 Anon Key를 확보한다.

쉬운 설명 (비유)

Supabase는 "레고 백엔드 키트"와 같다.

직접 서버를 만드는 것 = 나무를 베고, 못을 깎고, 집을 짓는 것
Supabase를 쓰는 것 = 이미 만들어진 레고 블록을 조립하는 것

가입 → Organization(회사/팀) → 프로젝트(앱 하나) → 인증 설정
마치 아파트 단지에 입주하면서 동(Organization)과 호수(Project)를
배정받고, 현관 비밀번호(인증)를 설정하는 것과 같다!

실무 예제: Supabase 프로젝트 설정 단계별 안내

[1단계] 가입하기
  → supabase.com 방문 → Sign Up → Organization 생성
  → 이름: 아무거나, 종류: Personal, 플랜: Free

[2단계] 프로젝트 생성
  → New Project 클릭
  → Organization 선택 (방금 만든 것)
  → Project name: k-nomad (원하는 이름)
  → Database Password: Generate Password → Copy → 안전한 곳에 저장!
  → Region: Northeast Asia (Seoul) → Create new project

[3단계] Email Provider 설정 (약 10분 후 활성화 완료)
  → Authentication → Sign In / Providers → Email 선택
  → "Confirm Email" 토글 → OFF (개발용: 이메일 확인 없이 가입 가능)
  → Save

[4단계] 연결 정보 확보
  → 상단 [Connect] 버튼 클릭
  → App Frameworks 탭 → Next.js 선택
  → NEXT_PUBLIC_SUPABASE_URL 복사
  → NEXT_PUBLIC_SUPABASE_ANON_KEY 복사
  → .env.local 파일에 저장

핵심 체크포인트

  • [ ] Supabase는 Firebase와 유사하지만 PostgreSQL 기반으로 SQL 유연성을 갖춘 BaaS 플랫폼이다
  • [ ] Organization → Project 순서로 생성하며, Free 플랜으로 무료 사용 가능하다
  • [ ] Database Password는 생성 시 반드시 복사해서 안전하게 보관해야 한다
  • [ ] Confirm Email을 해제하면 이메일 확인 없이 회원가입이 가능해진다 (개발 편의용)
  • [ ] Supabase 무료 이메일 발송은 시간당 2개로 제한되므로, 개발 중에는 Confirm Email을 끄는 것이 합리적이다
  • [ ] Region은 사용자와 가까운 곳(서울)을 선택해야 성능이 좋다

섹션 2: Context7 MCP 연동하기

한 줄 요약

Context7 MCP를 클로드 코드에 설치하여 최신 라이브러리 문서를 자동으로 참조할 수 있게 한다.

쉬운 설명 (비유)

LLM의 문제: 학습 데이터에 최신 정보가 없을 수 있다!

Context7 MCP = "실시간 백과사전 도우미"

일반 LLM: 작년에 배운 교과서만 가지고 답변
Context7 연동 LLM: 최신 공식 문서를 실시간으로 찾아서 답변

예) Supabase가 올해 API를 바꿨다면?
  ❌ Context7 없이: 옛날 API로 코드 작성 → 에러
  ✅ Context7 있으면: 최신 공식 문서 참조 → 정확한 코드

실무 예제: Context7 설치 및 확인

# 1. Context7 MCP 설치 (Local Connection 방식)
claude mcp add context7 -- npx -y @upstash/context7-mcp

# 설치 성공 메시지:
# Added stdio MCP server context7 with command: npx -y @upstash/context7-mcp
# to local config

# 2. 연결 확인
# 클로드 코드에서 /mcp 명령어 실행
# context7 ✓ connected 체크 표시 확인

핵심 체크포인트

  • [ ] LLM은 학습 데이터 이후의 최신 정보를 모를 수 있으므로, Context7 MCP로 최신 문서를 보완한다
  • [ ] claude mcp add context7 -- npx -y @upstash/context7-mcp 명령으로 설치한다
  • [ ] /mcp 명령으로 context7이 connected 상태인지 확인할 수 있다
  • [ ] Context7 공식 깃허브: github.com/upstash/context7

섹션 3: Supabase 인증 연동하기

한 줄 요약

클로드 코드에게 경계를 명확히 지정한 프롬프트로 Supabase Auth SSR 인증 시스템을 구현하고, .env.local에 값을 입력하여 로그인/회원가입을 완성한다.

쉬운 설명 (비유)

인증 연동 = "건물에 출입 통제 시스템 설치하기"

1단계: 경비 회사에 설계도 요청 (클로드에게 계획 요청)
  → "이메일 로그인만, SSR 방식으로, 코드는 아직 쓰지 마"
  → 경비 회사가 "이렇게 설치하겠습니다" 계획서 제출

2단계: 계획 확인 후 시공 지시 (작업 실행)
  → "계획대로 하되, 절대 범위를 벗어나지 마"
  → 출입카드 시스템(미들웨어), 문 잠금장치(인증 페이지),
     방문자 기록부(콜백 처리)가 한 번에 설치됨

3단계: 열쇠 넣기 (.env.local에 값 입력)
  → 출입 시스템이 동작하려면 실제 열쇠(URL, Key)가 필요

실무 예제: 클로드 코드에게 인증 구현 지시하기

프롬프트 1: 계획 수립 요청 (경계 설정이 핵심!)

Supabase Auth를 연동하려고 해.
- 소셜 로그인은 추가하지 않을거야 이메일 로그인만 사용할 거야.
- SSR이 지원되는 형태로 계획을 알려줘.
- 실제 코드는 아직 작성하지 말고 어떻게 해야 하는지 알려주기만 해.
- context7을 사용해서 최신 Supabase 사용법을 알아봐줘.

클로드의 SSR 구현 계획 (핵심 구조):

1. @supabase/ssr 패키지 사용 - 최신 SSR 전용 패키지
2. Cookie 기반 세션 관리 - getAll/setAll 방식으로 쿠키 처리
3. Next.js 14 App Router 방식 - Server Components와 Server Actions 활용
4. Middleware 인증 보호 - 전역 인증 상태 관리

생성되는 파일 구조:

프로젝트/
├── .env.local                          ← Supabase URL/Key 설정
├── middleware.ts                       ← 전역 인증 보호 및 세션 갱신
├── src/
│   ├── utils/supabase/
│   │   ├── server.ts                   ← 서버 컴포넌트용 클라이언트
│   │   ├── client.ts                   ← 브라우저용 클라이언트
│   │   └── middleware.ts               ← 미들웨어용 세션 관리
│   ├── app/
│   │   ├── login/
│   │   │   ├── page.tsx                ← 로그인/회원가입 폼 (Server Actions)
│   │   │   └── actions.ts             ← 로그인/회원가입 서버 액션
│   │   ├── register/
│   │   │   └── page.tsx                ← 간소화된 회원가입 폼
│   │   ├── auth/callback/
│   │   │   └── route.ts               ← 이메일 확인 토큰 처리
│   │   └── error/
│   │       └── page.tsx                ← 에러 페이지
│   └── components/
│       ├── auth/UserMenu.tsx           ← 사용자 메뉴 컴포넌트
│       └── layout/Header.tsx           ← 헤더에 사용자 상태 통합

프롬프트 2: 작업 실행 지시

현재 계획한 플랜을 기반으로 작업을 실행해줘.
우리 계획을 벗어나는 작업은 절대로 하지 말고
작업이 끝나면 어떤 작업들을 했는지 분석해서 알려줘.

클로드가 수행한 작업 목록:

1. 환경 설정
   - .env.local 파일 생성 (Supabase URL/Key 설정)

2. 의존성 설치
   - @supabase/supabase-js, @supabase/ssr 패키지 설치

3. Supabase 클라이언트 유틸리티
   - src/utils/supabase/server.ts - 서버 컴포넌트용 클라이언트
   - src/utils/supabase/client.ts - 브라우저용 클라이언트
   - src/utils/supabase/middleware.ts - 미들웨어용 세션 관리

4. Next.js 미들웨어
   - middleware.ts - 전역 인증 보호 및 세션 갱신

5. 인증 페이지
   - src/app/login/page.tsx - 기존 UI를 Server Actions 방식으로 변경
   - src/app/register/page.tsx - 간소화된 회원가입 폼으로 변경

6. Server Actions
   - src/app/login/actions.ts - 로그인/회원가입 서버 액션

7. 콜백 처리
   - src/app/auth/callback/route.ts - 이메일 확인 토큰 처리
   - src/app/error/page.tsx - 에러 페이지

8. 사용자 세션 확인
   - src/components/auth/UserMenu.tsx - 사용자 메뉴 컴포넌트
   - src/components/layout/Header.tsx - 헤더에 사용자 상태 통합

핵심 체크포인트

  • [ ] 클로드 코드에게 작업을 요청할 때 반드시 경계를 명확히 설정해야 한다 ("코드는 아직 쓰지 마", "범위를 벗어나지 마")
  • [ ] @supabase/supabase-js@supabase/ssr 두 패키지가 함께 설치되어야 SSR 인증이 동작한다
  • [ ] 서버/클라이언트/미들웨어 각각 별도의 Supabase 클라이언트 유틸리티가 필요하다
  • [ ] .env.local 파일에는 민감한 정보(URL, Key)가 들어가므로 클로드 코드가 직접 수정하지 않을 수 있다 → 직접 입력해야 한다
  • [ ] 환경변수 키 이름이 다르게 생성된 경우, 클로드 코드에 물어보면 올바른 키 이름을 알려준다
  • [ ] Server Components에서 getUser()로 세션을 확인하고, 비인증 사용자는 자동 리다이렉트된다
  • [ ] 서버 재시작했을 때 오류가 없으면 인증 연동 성공이다

연습문제

문제 1 (기본)

Supabase 프로젝트 생성 시 반드시 복사해서 저장해야 하는 값 2가지는 무엇이고, 각각 어디에 사용되는가?

정답 보기 1. **Database Password** — 데이터베이스에 직접 접근할 때 필요한 비밀번호 2. **Supabase URL + Anon Key** — 애플리케이션에서 Supabase API에 연결할 때 .env.local에 설정하는 값 Database Password는 프로젝트 생성 시 한 번만 보여주므로 반드시 즉시 복사해야 하고, URL과 Anon Key는 [Connect] 버튼에서 언제든 다시 확인할 수 있다.

문제 2 (중급)

클로드 코드에게 인증 구현을 요청할 때 "경계를 명확히 설정하라"고 강조하는 이유는 무엇인가? 구체적인 프롬프트 예시와 함께 설명하라.

정답 보기 클로드 코드는 혼자 충분히 코딩할 수 있지만, 범위를 제한하지 않으면 불필요한 기능까지 추가하거나 예상치 못한 변경을 할 수 있다. **경계 설정 프롬프트 예시:** - "실제 코드는 아직 작성하지 말고 어떻게 해야 하는지 알려주기만 해" → 계획 단계와 실행 단계 분리 - "소셜 로그인은 추가하지 않을거야 이메일 로그인만 사용할 거야" → 기능 범위 제한 - "우리 계획을 벗어나는 작업은 절대로 하지 말고" → 실행 시 이탈 방지 이렇게 2단계(계획→실행)로 나누면 계획을 검토한 후 안전하게 실행할 수 있다.

문제 3 (심화)

SSR 인증에서 서버용(server.ts), 클라이언트용(client.ts), 미들웨어용(middleware.ts) Supabase 클라이언트를 각각 따로 만드는 이유를 설명하라. 하나로 통합하면 어떤 문제가 발생하는가?

정답 보기 각 실행 환경에서 쿠키를 다루는 방식이 다르기 때문에 별도 클라이언트가 필요하다: | 클라이언트 | 실행 환경 | 쿠키 접근 방식 | |-----------|---------|------------| | server.ts | Server Components | `cookies()` API로 읽기 전용 접근 | | client.ts | 브라우저 | `document.cookie`로 직접 접근 | | middleware.ts | Edge Runtime | Request/Response 헤더를 통해 쿠키 읽기/쓰기 | 하나로 통합하면: - 서버에서 `document.cookie`를 호출하면 에러 발생 (브라우저 전용 API) - 미들웨어에서는 세션 갱신(쓰기)이 필요하지만, Server Components는 읽기만 해야 한다 - 각 환경의 보안 모델이 다르므로 권한 분리가 필수적이다 `@supabase/ssr` 패키지는 `getAll/setAll` 방식으로 쿠키를 추상화하여 이 차이를 통일된 인터페이스로 관리한다.

부록 A: 용어 사전

용어 설명
Supabase PostgreSQL 기반 오픈소스 BaaS. 인증, DB, 스토리지, Edge Functions 등 제공
BaaS (Backend as a Service) 서버 없이 백엔드 기능을 클라우드로 제공받는 서비스 모델
Organization Supabase에서 프로젝트들을 묶는 상위 단위 (회사/팀 단위)
Anon Key Supabase 클라이언트 접속용 공개 키. Row Level Security(RLS)로 보안 유지
Database Password Supabase PostgreSQL 데이터베이스 직접 접근용 비밀번호
Email Provider Supabase 인증에서 이메일/비밀번호 기반 로그인을 처리하는 인증 제공자
Confirm Email 가입 시 이메일 인증을 요구하는 Supabase 설정. 해제하면 즉시 가입 가능
Context7 MCP LLM이 최신 패키지 문서를 실시간 참조하도록 도와주는 MCP 서버
@supabase/ssr SSR 환경에서 쿠키 기반 세션을 관리하는 Supabase 전용 패키지
@supabase/supabase-js Supabase JavaScript 클라이언트 라이브러리의 코어 패키지
Server Actions Next.js에서 서버 측에서 실행되는 비동기 함수. 폼 처리에 주로 사용
Middleware 요청-응답 사이에서 실행되는 코드. 인증 검사, 세션 갱신, 리다이렉트 처리
SSR Server-Side Rendering. 서버에서 HTML을 렌더링하여 SEO와 보안에 유리
getUser() Supabase에서 현재 로그인한 사용자 정보를 가져오는 함수
Callback Route 이메일 인증 후 토큰을 처리하는 라우트 (/auth/callback)

부록 B: 비교표

Supabase vs Firebase

비교 항목 Supabase Firebase
데이터베이스 PostgreSQL (관계형) Firestore (NoSQL)
오픈소스 O 완전 오픈소스 X Google 독점
SQL 지원 O 표준 SQL X 자체 쿼리 문법
셀프 호스팅 O 가능 X 불가능
인증 O 내장 O 내장
무료 티어 2개 프로젝트, 500MB Spark 플랜
실시간 O 지원 O 지원

인증 구현 방식 비교

비교 항목 직접 구현 Supabase Auth
개발 시간 X 수일~수주 O 수시간
비밀번호 해싱 직접 구현 (bcrypt 등) 자동 처리
세션 관리 JWT/쿠키 직접 관리 @supabase/ssr 자동 관리
소셜 로그인 각 OAuth 직접 연동 설정만으로 활성화
보안 업데이트 직접 패치 Supabase가 관리
바이브 코딩 적합성 X 낮음 (복잡) O 높음 (빠른 구현)

Supabase 클라이언트 유틸리티 비교

파일 실행 환경 용도 쿠키 처리
server.ts Server Components DB 조회, 사용자 확인 cookies() 읽기 전용
client.ts 브라우저 (Client Components) 실시간 구독, 클라이언트 인증 document.cookie
middleware.ts Edge Runtime (Middleware) 세션 갱신, 인증 보호 Request/Response 헤더

부록 C: 참고 자료

자료 URL
Supabase 공식 홈페이지 https://supabase.com
Supabase Auth 문서 https://supabase.com/docs/guides/auth
Supabase + Next.js SSR 가이드 https://supabase.com/docs/guides/auth/server-side/nextjs
@supabase/ssr 패키지 https://github.com/supabase/auth-helpers
Context7 공식 깃허브 https://github.com/upstash/context7
코드팩토리 깃허브 https://github.com/codefactory-co
유튜브 강의 보충 자료 https://bit.ly/4oisp3D
난이도
에피소드
질문
카드를 로딩 중...
답변

클릭하거나 Space를 눌러 뒤집기

0 / 0
학습 진도 0%
이동   Space 뒤집기   R 셔플